home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
tex
/
td187src.lzh
/
PICTOMET.I
< prev
next >
Wrap
Text File
|
1991-12-14
|
33KB
|
1,083 lines
IMPLEMENTATION MODULE PicToMeta;
(* Wandelt Graphikfiles in's *)
(* Metafont-Format *)
(* JP 16/11/90 18:30 *)
(* Letzte Änderung: 01/12/90 14:26 *)
(* Letzte Änderung: 17/03/91 11:08 *)
FROM Dialoge IMPORT BusyStart, BusyEnd, ChangePicRes, GetFontRes;
FROM Diverses IMPORT NumAlert;
FROM FileIO IMPORT Rewrite, WriteLn, Close, Reset, EOF, ReadChar;
FROM SYSTEM IMPORT ADDRESS , ADR;
FROM Storage IMPORT ALLOCATE , DEALLOCATE ;
FROM Types IMPORT ObjectPtrTyp, sourceformat, targetformat;
IMPORT CommonData;
IMPORT GetFile;
IMPORT MagicStrings ;
IMPORT MagicSys ;
IMPORT mtAlerts;
IMPORT Variablen;
(**
IMPORT RTD;
**)
TYPE LinePtr = POINTER TO LineRec;
LineRec = RECORD
start, end, line, depth : INTEGER;
Prev, Next : LinePtr;
END;
VAR
RdHandle : INTEGER;
WtHandle : INTEGER;
OptimizeMode : BOOLEAN;
MetafontMode : targetformat;
FirstPtr : LinePtr;
startx : INTEGER;
endx : INTEGER;
Xmul, Ymul : INTEGER;
XYswap : BOOLEAN; (* fürs PAC-Format benötigt *)
DebugLevel : CARDINAL;
PROCEDURE ggT(x, y : INTEGER) : INTEGER;
VAR a, b, r : INTEGER;
BEGIN
a := x; (* Euklidischer Algorithmus *)
b := y;
REPEAT
r := b MOD a;
b := a;
a := r;
UNTIL r=0;
RETURN b;
END ggT;
(**
PROCEDURE AppendChar(c : CHAR; VAR target : ARRAY OF CHAR);
VAR temp : ARRAY [0..1] OF CHAR;
BEGIN
temp[0] := c;
temp[1] := 0C;
MagicStrings.Append(temp, target);
END AppendChar;
**)
PROCEDURE GetOutFileName( input : ARRAY OF CHAR;
VAR output : ARRAY OF CHAR);
VAR i : INTEGER;
BEGIN
MagicStrings.Assign( input, output );
CASE MetafontMode OF
metafont: i := 4; |
tex : i := 2; |
gfpk: i := 10; |
ELSE
i := 0;
END;
IF i>0 THEN
GetFile.ReplaceExtension(output, CommonData.Extensions[i]);
END;
GetFile.RemovePath(output);
CASE MetafontMode OF
metafont : IF CommonData.MetaPath[0]<>0C THEN
MagicStrings.Insert(CommonData.MetaPath, output, 0);
END; |
tex : IF CommonData.LaTeXPath[0]<>0C THEN
MagicStrings.Insert(CommonData.LaTeXPath, output, 0);
END; |
gfpk : IF CommonData.GFPKPath[0]<>0C THEN
MagicStrings.Insert(CommonData.GFPKPath, output, 0);
END; |
ELSE
END;
END GetOutFileName;
PROCEDURE WriteMetaProlog(xo, yo, X, Y : INTEGER;
info : ARRAY OF CHAR);
(* X, Y : Zahl der Spalten und Zeilen *)
(* xo, yo : Größe eines Pixels in µm *)
VAR Line, String : ARRAY [0..127] OF CHAR;
Comment : ARRAY [0..1] OF CHAR;
BEGIN
Comment := '%';
WriteLn ( WtHandle, Comment ) ;
WriteLn ( WtHandle, '% Graphic-font-file (created by TeX-Draw, JP-90)');
IF OptimizeMode THEN
WriteLn ( WtHandle,
'% I tried to minimize the number of commands (not very well I fear).');
ELSE
WriteLn ( WtHandle,
'% There are no optimizations at all (well just one)');
END;
WriteLn ( WtHandle, info ) ;
WriteLn ( WtHandle, Comment ) ;
WriteLn ( WtHandle, 'mode_setup;' ) ;
WriteLn ( WtHandle, 'font_identifier:="TeXDraw-Picture";');
WriteLn ( WtHandle, 'font_coding_scheme:="TeXDraw-Conversion";');
WriteLn ( WtHandle, Comment ) ;
WriteLn ( WtHandle, "% This file contains just one graphic, so we don't need to");
WriteLn ( WtHandle, '% specify values for fontdimen 1..7 (at least I hope so).');
WriteLn ( WtHandle, Comment ) ;
Line := 'xu# := '; Variablen.NumberToStr(xo, String);
MagicStrings.Append( String, Line);
MagicStrings.Append( ' * 0.001 * mm#;' , Line);
WriteLn ( WtHandle, Line);
Line := 'yu# := '; Variablen.NumberToStr(yo, String);
MagicStrings.Append( String, Line);
MagicStrings.Append( ' * 0.001 * mm#;' , Line);
WriteLn ( WtHandle, Line);
Line := 'symb_w#:='; Variablen.NumberToStr(X, String);
MagicStrings.Append( String, Line);
MagicStrings.Append( ' * xu#;', Line);
WriteLn ( WtHandle, Line);
Line := 'symb_h#:='; Variablen.NumberToStr(Y, String);
MagicStrings.Append( String, Line);
MagicStrings.Append( ' * yu#;', Line);
WriteLn ( WtHandle, Line);
WriteLn ( WtHandle, 'font_size symb_h#;');
WriteLn ( WtHandle, 'define_pixels(xu, yu);');
WriteLn ( WtHandle, Comment);
Line := 'beginchar(';
Variablen.NumberToStr(CommonData.MetaPAscii, String);
MagicStrings.Append( String, Line);
MagicStrings.Append(', symb_w#, symb_h#, 0); "The picture', Line);
IF (CommonData.MetaPAscii>=32) AND (CommonData.MetaPAscii<127) THEN
String := ' (?)';
String[2] := CHR(CommonData.MetaPAscii);
MagicStrings.Append( String, Line);
END;
MagicStrings.Append('.";', Line);
WriteLn ( WtHandle, Line );
WriteLn ( WtHandle, 'pickup pensquare xscaled xu yscaled yu;');
END WriteMetaProlog;
(**********************************************************)
PROCEDURE WriteTeXProlog(xo, yo, X, Y : INTEGER;
info : ARRAY OF CHAR);
(* X, Y : Zahl der Spalten und Zeilen *)
(* xo, yo : Größe eines Pixels in µm *)
VAR Line, String : ARRAY [0..127] OF CHAR;
Comment : ARRAY [0..1] OF CHAR;
ggTVal : INTEGER;
BEGIN
Comment := '%';
WriteLn ( WtHandle, Comment ) ;
WriteLn ( WtHandle, '% Graphic-TeX-file (created by TeX-Draw, JP-90)');
IF OptimizeMode THEN
WriteLn ( WtHandle,
'% I tried to minimize the number of commands (not very well I fear).');
ELSE
WriteLn ( WtHandle,
'% There are no optimizations at all (well just one)');
END;
WriteLn ( WtHandle, info ) ;
WriteLn ( WtHandle, Comment ) ;
WriteLn ( WtHandle, '\newdimen\mum \mum=0.001mm' ) ;
ggTVal := ggT(xo, yo);
Xmul := xo DIV ggTVal;
Ymul := yo DIV ggTVal;
Line := '\newdimen\xu \xu='; Variablen.NumberToStr(xo, String);
MagicStrings.Append( String, Line);
MagicStrings.Append( '\mum' , Line);
WriteLn ( WtHandle, Line);
Line := '\newdimen\yu \yu='; Variablen.NumberToStr(yo, String);
MagicStrings.Append( String, Line);
MagicStrings.Append( '\mum' , Line);
WriteLn ( WtHandle, Line);
Line := "\setlength{\unitlength}{";
Variablen.NumberToStr(ggTVal, String); MagicStrings.Append( String, Line);
MagicStrings.Append( '\mum}' , Line);
WriteLn ( WtHandle, Line) ;
Line := '\begin{picture}(';
Variablen.NumberToStr(X * Xmul, String); MagicStrings.Append( String, Line);
(* AppendChar(',', Line);*)
MagicStrings.Append(',', Line);
Variablen.NumberToStr(Y * Ymul, String); MagicStrings.Append( String, Line);
(* AppendChar(')', Line);*)
MagicStrings.Append(')', Line);
WriteLn ( WtHandle, Line);
END WriteTeXProlog;
(**********************************************************)
PROCEDURE WriteMetaEpilog;
VAR Line : ARRAY [0..127] OF CHAR;
BEGIN
WriteLn ( WtHandle, 'endchar; % Pooh, this was lot of work...');
WriteLn ( WtHandle, 'end.');
END WriteMetaEpilog;
(**********************************************************)
PROCEDURE WriteTeXEpilog;
BEGIN
WriteLn ( WtHandle, '\end{picture} % Pooh, this was lot of work...');
END WriteTeXEpilog;
(**********************************************************)
PROCEDURE DoLine(start, end, second, depth : INTEGER);
VAR Start, End, Third : INTEGER;
LowY, LowX : INTEGER;
temp,
Line, number : ARRAY [0..127] OF CHAR;
PROCEDURE AddNum(a, b : INTEGER;
REF txt : ARRAY OF CHAR);
BEGIN
IF XYswap THEN
Variablen.NumberToStr(a, number);
ELSE
Variablen.NumberToStr(b, number);
END;
MagicStrings.Append( number, Line);
MagicStrings.Append( txt, Line);
END AddNum;
PROCEDURE AddFill(a, b : INTEGER;
minus : BOOLEAN;
REF txt : ARRAY OF CHAR);
VAR i : INTEGER;
BEGIN
IF XYswap THEN
i